package br.com.imob.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author Gilton Nascimento
 */
@Entity
@Table(name = "\"PESSOA\"", catalog = "imob", schema = "public", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"cpf"})})
@NamedQueries({
    @NamedQuery(name = "Pessoa.findAll", query = "SELECT p FROM Pessoa p"),
    @NamedQuery(name = "Pessoa.findByPessoaId", query = "SELECT p FROM Pessoa p WHERE p.pessoaId = :pessoaId"),
    
    @NamedQuery(name = "Pessoa.findByNome", query = "SELECT p FROM Pessoa p WHERE p.nome = :nome"),
    @NamedQuery(name = "Pessoa.findLikeByNome", query = "SELECT p FROM Pessoa p WHERE p.nome Like :nome"),
    
    @NamedQuery(name = "Pessoa.findBySobrenome", query = "SELECT p FROM Pessoa p WHERE p.sobrenome = :sobrenome"),
    @NamedQuery(name = "Pessoa.findLikeBySobrenome", query = "SELECT p FROM Pessoa p WHERE p.sobrenome Like :sobrenome"),
    
    @NamedQuery(name = "Pessoa.findByRg", query = "SELECT p FROM Pessoa p WHERE p.rg = :rg"),
    @NamedQuery(name = "Pessoa.findByCpf", query = "SELECT p FROM Pessoa p WHERE p.cpf = :cpf"),
    @NamedQuery(name = "Pessoa.findByNascimento", query = "SELECT p FROM Pessoa p WHERE p.nascimento = :nascimento"),
    @NamedQuery(name = "Pessoa.findBySexo", query = "SELECT p FROM Pessoa p WHERE p.sexo = :sexo"),
    
    @NamedQuery(name = "Pessoa.findByEstadoCivil", query = "SELECT p FROM Pessoa p WHERE p.estadoCivil = :estadoCivil"),
    @NamedQuery(name = "Pessoa.findLikeByEstadoCivil", query = "SELECT p FROM Pessoa p WHERE p.estadoCivil Like :estadoCivil"),
    
    @NamedQuery(name = "Pessoa.findByRegime", query = "SELECT p FROM Pessoa p WHERE p.regime = :regime"),
    @NamedQuery(name = "Pessoa.findLikeByRegime", query = "SELECT p FROM Pessoa p WHERE p.regime Like :regime"),
    
    @NamedQuery(name = "Pessoa.findByFoto", query = "SELECT p FROM Pessoa p WHERE p.foto = :foto"),
    @NamedQuery(name = "Pessoa.findByRenda", query = "SELECT p FROM Pessoa p WHERE p.renda = :renda"),
    @NamedQuery(name = "Pessoa.findByRendaTotal", query = "SELECT p FROM Pessoa p WHERE p.rendaTotal = :rendaTotal"),
    @NamedQuery(name = "Pessoa.findByDataCadastro", query = "SELECT p FROM Pessoa p WHERE p.dataCadastro = :dataCadastro"),
    
    @NamedQuery(name = "Pessoa.findLikeByProfissao", query = "SELECT p FROM Pessoa p WHERE p.profissao Like :profissao"),
    
    @NamedQuery(name = "Pessoa.findByLogomarca", query = "SELECT p FROM Pessoa p WHERE p.logomarca = :logomarca"),
    
    @NamedQuery(name = "Pessoa.findByTipoPessoa", query = "SELECT p FROM Pessoa p WHERE p.tipoPessoa = :tipoPessoa"),
    @NamedQuery(name = "Pessoa.findLikeByTipoPessoa", query = "SELECT p FROM Pessoa p WHERE p.tipoPessoa Like :tipoPessoa")
    })
    
public class Pessoa extends ControlEntities implements Serializable {
    
	private static final long serialVersionUID = 1L;

    @Id
//  <editor-fold defaultstate="collapsed" desc="Geradores de Sequencias">
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_STORE")
    @SequenceGenerator(name = "SEQ_STORE", sequenceName = "next_pessoa")// </editor-fold>
    @Basic(optional = false)
    @Column(name = "pessoa_id", nullable = false)
    private Integer pessoaId;
    
    @Basic(optional = false)
    @Column(name = "nome", nullable = false, length = 120)
    private String nome;
    
    @Basic(optional = false)
    @Column(name = "sobrenome", nullable = false, length = 50)
    private String sobrenome;
    
    @Column(name = "rg")
    private String rg;
    
    @Basic(optional = false)
    @Column(name = "cpf", nullable = false, length = 15)
    private String cpf;
    
    @Column(name = "nascimento", length = 12)
    private String nascimento;
    
    @Column(name = "sexo", length = 10)
    private String sexo;
    
    @Column(name = "estado_civil", length = 2147483647)
    private String estadoCivil;
    
    @Column(name = "regime", length = 20)
    private String regime;
    
    @Column(name = "foto", length = 2147483647)
    private String foto;
    
    @Column(name = "renda", precision = 17, scale = 17)
    private Double renda;
    
    @Column(name = "renda_total", precision = 17, scale = 17)
    private Double rendaTotal;
    
    @Column(name = "data_cadastro")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    
    @Column(name = "profissao", length = 50)
    private String profissao;
    
    @Column(name = "logomarca", length = 2147483647)
    private String logomarca;
    
    @Basic(optional = false)
    @Column(name = "tipo_pessoa", nullable = false, length = 40)
    private String tipoPessoa;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Conta> contaList;
    
    @OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Pessoa> pessoaList;
    
    @JoinColumn(name = "conjuge_id", referencedColumnName = "pessoa_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Pessoa pessoa;
    
    @JoinColumn(name = "origem_id", referencedColumnName = "origem_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Origem origem;
    
    @JoinColumn(name = "login_id", referencedColumnName = "login_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Login login;
    
    @JoinColumn(name = "endereco_id", referencedColumnName = "endereco_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Endereco endereco;
    
    @JoinColumn(name = "contato_id", referencedColumnName = "contato_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Contato contato;
    
    @JoinColumn(name = "agenda_id", referencedColumnName = "agenda_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Agenda agenda;
    
    @OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Corretor> corretorList;
    
    @OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Relacionamento> relacionamentoList;
    
    @OneToMany(mappedBy = "pessoa1", fetch = FetchType.LAZY)
    private List<Relacionamento> relacionamentoList1;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Grupo> grupoList;
    
    @OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Construtora> construtoraList;
    
    @OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Imovel> imovelList;
    
    @OneToMany(mappedBy = "pessoa1", fetch = FetchType.LAZY)
    private List<Imovel> imovelList1;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<Cliente> clienteList;
    
    @OneToMany(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<AcompanhamentoFisico> acompanhamentoFisicoList;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoa1", fetch = FetchType.LAZY)
    private List<AcompanhamentoFisico> acompanhamentoFisicoList1;
    
    public Pessoa() { }
    public Pessoa(Integer pessoaId) { this.pessoaId = pessoaId; }
    
    public Pessoa(String nom, String sbnome, String sex, String rg, String cpf, String ecivil) {
    	nome = nom;
    	sobrenome = sbnome;
    	sexo = sex;
    	this.rg = rg;
    	this.cpf = cpf;
    	estadoCivil = ecivil;
    }
    public Pessoa(int id, String nom, String sbnome, String sex, String rg, String cpf, String ecivil) {
    	this(nom, sbnome, sex, rg, cpf, ecivil);
    	pessoaId = id;
    }
    
    public Pessoa(String tpStr, String arg) {
    	if( "nome".equalsIgnoreCase( tpStr ) )			nome = arg;
    	if( "sobrenome".equalsIgnoreCase( tpStr ) )		sobrenome = arg;
    	if( "rg".equalsIgnoreCase( tpStr ) )			rg = arg;
    	if( "cpf".equalsIgnoreCase( tpStr ) )			cpf = arg;
    	if( "nascimento".equalsIgnoreCase( tpStr ) )	nascimento = arg;
    	if( "sexo".equalsIgnoreCase( tpStr ) )			sexo = arg;
    	if( "estadoCivil".equalsIgnoreCase( tpStr ) )	estadoCivil = arg;
    	if( "regime".equalsIgnoreCase( tpStr ) )		regime = arg;
    	if( "foto".equalsIgnoreCase( tpStr ) )			foto = arg;
    	if( "renda".equalsIgnoreCase( tpStr ) )			renda = str2Double(arg);
    	if( "rendaTotal".equalsIgnoreCase( tpStr ) )	rendaTotal = str2Double(arg);
    	if( "dataCadastro".equalsIgnoreCase( tpStr ) )	dataCadastro = str2Date(arg);
    	if( "profissao".equalsIgnoreCase( tpStr ) )		profissao = arg;
    	if( "logomarca".equalsIgnoreCase( tpStr ) )		logomarca = arg;
    	if( "tipoPessoa".equalsIgnoreCase( tpStr ) )	tipoPessoa = arg;
    }
    public Pessoa(int id, String tpStr, String arg) {
    	this(tpStr, arg);
    	pessoaId = id;
    }
    
    public Pessoa ( int id, String nom, String sbnome, String rg, String cpf, String sex, 
    		String eCivil, String regim, String fot, double rend, double rendTotal, 
    		String dtCadastro, String prof, String logomarc, String tpPessoa 
    		) {
    	pessoaId = id;
    	nome = nom;
    	sobrenome = sbnome;
    	this.rg = rg;
    	this.cpf = cpf;
    	sexo = sex;
    	estadoCivil = eCivil;
    	regime = regim;
    	foto = fot;
    	renda = rend;
    	rendaTotal = rendTotal;
    	dataCadastro = str2Date(dtCadastro);
    	profissao = prof;
    	logomarca = logomarc;
    	tipoPessoa = tpPessoa;
    }
    
//	Getts and Setts
    public Integer getPessoaId() {
        return pessoaId;
    }

    public void setPessoaId(Integer pessoaId) {
        this.pessoaId = pessoaId;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNascimento() {
        return nascimento;
    }

    public void setNascimento(String nascimento) {
        this.nascimento = nascimento;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public String getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(String estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    public String getRegime() {
        return regime;
    }

    public void setRegime(String regime) {
        this.regime = regime;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public Double getRenda() {
        return renda;
    }

    public void setRenda(Double renda) {
        this.renda = renda;
    }

    public Double getRendaTotal() {
        return rendaTotal;
    }

    public void setRendaTotal(Double rendaTotal) {
        this.rendaTotal = rendaTotal;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public String getLogomarca() {
        return logomarca;
    }

    public void setLogomarca(String logomarca) {
        this.logomarca = logomarca;
    }

    public String getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(String tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }

    public List<Conta> getContaList() {
        return contaList;
    }

    public void setContaList(List<Conta> contaList) {
        this.contaList = contaList;
    }

    public List<Pessoa> getPessoaList() {
        return pessoaList;
    }

    public void setPessoaList(List<Pessoa> pessoaList) {
        this.pessoaList = pessoaList;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public Origem getOrigem() {
        return origem;
    }

    public void setOrigem(Origem origem) {
        this.origem = origem;
    }

    public Login getLogin() {
        return login;
    }

    public void setLogin(Login login) {
        this.login = login;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Contato getContato() {
        return contato;
    }

    public void setContato(Contato contato) {
        this.contato = contato;
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }

    public List<Corretor> getCorretorList() {
        return corretorList;
    }

    public void setCorretorList(List<Corretor> corretorList) {
        this.corretorList = corretorList;
    }

    public List<Relacionamento> getRelacionamentoList() {
        return relacionamentoList;
    }

    public void setRelacionamentoList(List<Relacionamento> relacionamentoList) {
        this.relacionamentoList = relacionamentoList;
    }

    public List<Relacionamento> getRelacionamentoList1() {
        return relacionamentoList1;
    }

    public void setRelacionamentoList1(List<Relacionamento> relacionamentoList1) {
        this.relacionamentoList1 = relacionamentoList1;
    }

    public List<Grupo> getGrupoList() {
        return grupoList;
    }

    public void setGrupoList(List<Grupo> grupoList) {
        this.grupoList = grupoList;
    }

    public List<Construtora> getConstrutoraList() {
        return construtoraList;
    }

    public void setConstrutoraList(List<Construtora> construtoraList) {
        this.construtoraList = construtoraList;
    }

    public List<Imovel> getImovelList() {
        return imovelList;
    }

    public void setImovelList(List<Imovel> imovelList) {
        this.imovelList = imovelList;
    }

    public List<Imovel> getImovelList1() {
        return imovelList1;
    }

    public void setImovelList1(List<Imovel> imovelList1) {
        this.imovelList1 = imovelList1;
    }

    public List<Cliente> getClienteList() {
        return clienteList;
    }

    public void setClienteList(List<Cliente> clienteList) {
        this.clienteList = clienteList;
    }

    public List<AcompanhamentoFisico> getAcompanhamentoFisicoList() {
        return acompanhamentoFisicoList;
    }

    public void setAcompanhamentoFisicoList(List<AcompanhamentoFisico> acompanhamentoFisicoList) {
        this.acompanhamentoFisicoList = acompanhamentoFisicoList;
    }

    public List<AcompanhamentoFisico> getAcompanhamentoFisicoList1() {
        return acompanhamentoFisicoList1;
    }

    public void setAcompanhamentoFisicoList1(List<AcompanhamentoFisico> acompanhamentoFisicoList1) {
        this.acompanhamentoFisicoList1 = acompanhamentoFisicoList1;
    }

    public String getNomeCompleto() {
    	return nome + " " + sobrenome;
    }
    
    public Object[] getValues(){
    	Object[] values = { pessoaId, nome, sobrenome, rg, cpf, sexo, estadoCivil, regime, foto, renda, 
    			rendaTotal, dataCadastro, profissao, logomarca, tipoPessoa };
    	return values;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (pessoaId != null ? pessoaId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Pessoa)) {
            return false;
        }
        Pessoa other = (Pessoa) object;
        if ((this.pessoaId == null && other.pessoaId != null) || (this.pessoaId != null && !this.pessoaId.equals(other.pessoaId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.imob.modelo.Pessoa[pessoaId=" + pessoaId + "]";
    }

}
